#pragma once
#include<ext/hash_map>
#include"io_buf.h"
#include<thread>
#include<mutex>
#include<assert.h>
#include<condition_variable>


//Hash表，用户io_buf内存块的管理
typedef __gnu_cxx::hash_map<int,io_buf*> pool_t;

//内存池的管理模块
enum M_CAP {
    m4K     = 4096,
    m16K    = 16384,
    m64K    = 65536,
    m256K   = 262144,
    m1M     = 1048576,
    m4M     = 4194304,
    m8M     = 8388608
};

//限制内存池大小：内存池最大为5G
#define M_LIMIT (5U*1024*1024)

/*
    内存池设置为单例模式
*/

class buf_pool{

private:
    buf_pool();
    buf_pool(const buf_pool&);
    const buf_pool& operator=(const buf_pool&);
public:
    static void init();
    static buf_pool* Getinstance();
/*
    alloc_buf()方法，是调用者从内存池中取出一块内存，
    如果最匹配的内存块存在，则返回，并将该块内存从buf_pool中摘除掉，
    如果没有则开辟一个内存出来。	 
    revert()方法则是将已经使用完的io_buf重新放回buf_pool中。
*/
    io_buf* alloc_buf(int n);
    io_buf* alloc_buf(){
        return alloc_buf(m4K);
    }

    //重置一个io_buf
    void revert(io_buf *buffer);
private:
    pool_t _pool;
    uint64_t _total_mem; //内存池的大小，单位为KB
    static pthread_mutex_t _mutex;
    static buf_pool*  _instance;
    static pthread_once_t _once;   //保证某个函数在多线程的情况下只能运行一次，这里让构造函数只能执行一次
};